package plg.grupo1.Lexico.StateMachineHierarchy;

import plg.grupo1.Lexico.reserveWords.NoExisteSimbolo;
import plg.grupo1.Lexico.reserveWords.SimboloNoTieneValorNumerico;
import plg.grupo1.Lexico.reserveWords.ValorFueraRango;

public class State10 implements State{
	
    private static State10 INSTANCE = null;    
	private State10(){}
	
    private synchronized static void createInstance() {
        if (INSTANCE == null) INSTANCE = new State10();
    }
    
    public static State10 getInstance() {
        if (INSTANCE == null) createInstance();
        return INSTANCE;
    }
    
	public void goNext(){
		
		if(Contexto.isEof()){//ultimo caracter por leer antes del eof
			try{
				Contexto.checkControlWord(Contexto.getLexema());
				Contexto.setCurrentState(State7.getInstance());
			}catch(NoExisteSimbolo e){
				Contexto.genErrorAndGoToInitialState("","Símbolo valido");
			}catch(SimboloNoTieneValorNumerico e){
				Contexto.genErrorAndGoToInitialState("","Símbolo sin valor numerico valido");
			}catch(ValorFueraRango e){
				Contexto.genErrorAndGoToInitialState("","Símbolo con valor numerico valido");
			}
		}
		else{

			char c = Contexto.getCharAndMoveToNext();//A	
			
			if(Contexto.isEscape(c)){
				//check control word
				try{
					Contexto.checkControlWord(Contexto.getLexema());
					Contexto.setCurrentState(State20.getInstance());
				}catch(NoExisteSimbolo e){
					Contexto.genErrorAndGoToInitialState("","Símbolo valido");
				}catch(SimboloNoTieneValorNumerico e){
					Contexto.genErrorAndGoToInitialState("","Símbolo sin valor numerico valido");
				}catch(ValorFueraRango e){
					Contexto.genErrorAndGoToInitialState("","Símbolo con valor numerico valido");
				}
			}else if(c==' '){
				//check control word
				try{
					Contexto.checkControlWord(Contexto.getLexema());
					Contexto.setCurrentState(State7.getInstance());
				}catch(NoExisteSimbolo e){
					Contexto.genErrorAndGoToInitialState("","Símbolo valido");
				}catch(SimboloNoTieneValorNumerico e){
					Contexto.genErrorAndGoToInitialState("","Símbolo sin valor numerico valido");
				}catch(ValorFueraRango e){
					Contexto.genErrorAndGoToInitialState("","Símbolo con valor numerico valido");
				}
			}
			else{
				Contexto.genErrorAndGoToInitialState(Character.toString(c),"LETRA,},{,\\,;, ,\n,\r,\n,\0,eof");
			}
		}
	}
}